/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package worms;

import java.util.Random;
import java.util.Scanner;
import java.util.regex.*;
import java.lang.String;

/**
 *
 * @author isen
 */
public class Warior extends Item {

    private String name;
    private int size;
    private int vie;
    private int vie_max = 1;
    Player proprietaire;

    public Warior() {
    }

    public Warior(String name, int size, GameGrid carte) {
        super(carte);
        this.name = name;
        this.size = size;
        this.vie = this.vie_max;
    }

    //methods
    public int addWarrior() {
        int test = 0;
        int X = this.x;
        int Y = this.y;

        if (testPOsitionMap() > 0) {
            test = 0;
        } else {
            test = 1;
            for (int j = Y - this.size / 2; j < Y + this.size / 2; j++) {
                for (int i = X - this.size / 2; i < X + this.size / 2; i++) {
                    this.x = i;
                    this.y = j;
                    apparaître();
                }
            }
            this.x = X;
            this.y = Y;
        }


        return test;
    }

    public int testPOsitionMap() {
        int test = 0;
        int X = this.x;
        int Y = this.y;
        try {
            for (int j = Y - this.size / 2; j < Y + this.size / 2; j++) {
                for (int i = X - this.size / 2; i < X + this.size / 2; i++) {
                    if (this.carte.getMap(i, j) != '*') {
                        test++;
                    }
                    if ((i < 1) || (i > this.carte.getLargeur())) {
                        test++;
                    }
                    if ((j < 1) || (j > this.carte.getHauteur())) {
                        test++;
                    }
                }
            }
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println(e.getMessage());
            test = 3;
        }
        return test;
    }

    public int deleteWarrior() {
        int test = 0;
        int X = this.x;
        int Y = this.y;
        for (int j = Y - this.size / 2; j < Y + this.size / 2; j++) {
            for (int i = X - this.size / 2; i < X + this.size / 2; i++) {
                this.x = i;
                this.y = j;
                disparaître();
            }
        }
        this.x = X;
        this.y = Y;



        return 1;
    }

    public void tirer(Player joueur, Warior tireur, int x, int y) {
        Random nombreDegat = new Random();
        int degats = 0;
        if (tireur.getType() == "assaut") {
            // Si le tireur est de type assaut 30 de dégats max
            degats = nombreDegat.nextInt(30);

        }
        if (tireur.getType() == "sniper") {
            // Si le tireur est de type sniper 70 de dégats max
            degats = nombreDegat.nextInt(70);

        }
        
        if ((x <= joueur.getAssaut().getPositionX() + 1 && x >= joueur.getAssaut().getPositionX() - 2) && (y <= joueur.getAssaut().getPositionY() + 1 && y >= joueur.getAssaut().getPositionY() - 2)) {
            // Si la cible est assaut enemi
            recevoirDegat(joueur.getAssaut(), 2 * degats); // Assaut tire 2 fois
            Worms.clear();
            System.out.println("Touché !");
        } else if ((x <= joueur.getSniper().getPositionX() && x >= joueur.getSniper().getPositionX() - 1) && (y <= joueur.getSniper().getPositionY() && y >= joueur.getSniper().getPositionY() - 1)) {
            // Si la cible est sniper ennemi
            recevoirDegat(joueur.getSniper(), degats);
            Worms.clear();
            System.out.println("Touché !");
        } else {
            Worms.clear();
            System.out.println("Loupé !");
        }



    }

    private void recevoirDegat(Warior cible, int degats) {

        cible.setVie(-degats); // actualisation de la vie suite aux dégats
        printDegat(degats);
        if (cible.getVie() <= 0) { // si plus de vie
            cible.deleteWarrior();
            // On décrément le nombre de worms vivants
            cible.proprietaire.setNumberOfWormsAlive(cible.proprietaire.getNumberOfWormsAlive() - 1);

        }


    }

    private void printDegat(int number) { // On affiche les dégats causés
        if (number == 0) {
            System.out.println("coup loupé:\t" + number);
        } else if (number < 10) {
            System.out.println("P'tit coup dégat:\t" + number);
        } else if (number < 20) {
            System.out.println("Moyen coup degat:\t" + number);
        } else if (number < 30) {
            System.out.println("Grand coup degat:\t" + number);
        }
    }

    public void bouger() {
        String moove;
        int index = 0, X, Y;
        do {
            do {
                Scanner keyboard = new Scanner(System.in);

                System.out.println("8: monter\t2: descendre\t4: gauche\t6: droite\n0: Quitter");

                moove = keyboard.nextLine();
            } while (!Pattern.matches("[02468]", moove) || moove.length() == 0);


            X = this.x;
            Y = this.y;


            if (deleteWarrior() == 1) {
                index = 0;
                switch (Integer.parseInt(moove)) {
                    case 8:
                        this.x = X;
                        this.y = Y - 1;//up

                        if (addWarrior() == 1) {
                            index = 1;
                        } else {
                            System.out.println("tu ne peux pas monter plus haut");
                            this.x = X;
                            this.y = Y;
                        }
                        break;
                    case 2:
                        this.x = X;
                        this.y = Y + 1;//Down
                        if (addWarrior() == 1) {
                            index = 1;
                        } else {
                            System.out.println("tu ne peux pas descendre plus bas");
                            this.x = X;
                            this.y = Y;
                        }
                        break;
                    case 4:
                        this.x = X - 1;//Left
                        this.y = Y;
                        if (addWarrior() == 1) {
                            index = 1;
                        } else {
                            System.out.println("tu ne peux pas aller plus à gauche");
                            this.x = X;
                            this.y = Y;
                        }
                        break;
                    case 6:
                        this.x = X + 1;//Right
                        this.y = Y;
                        if (addWarrior() == 1) {
                            index = 1;
                        } else {
                            System.out.println("tu ne peux pas aller plus à droite");
                            this.x = X;
                            this.y = Y;
                        }
                        break;
                    case 0:
                        System.exit(0);
                        break;
                    default:
                        System.out.println("error recommence");
                        break;
                }
            }


        } while (index == 0);

    }

    public int getSize() {
        return size;
    }

    public int getVie() {
        return vie;
    }

    public int getPositionX() {
        return this.x;
    }

    public int getPositionY() {
        return this.y;
    }

    public String getName() {
        return this.name;
    }

    public String getType() {
        String type = null;
        if (this.getName().indexOf("ASSAUT") != -1) {
            type = "assaut";
        }
        if (this.getName().indexOf("SNIPER") != -1) {
            type = "sniper";
        }
        return type;
    }

    public void setVie(int vie) {
        this.vie += vie;
        if (this.vie > this.vie_max) {
            this.vie = this.vie_max;
        }
    }
}
